package com.guqiang.invocation;

import android.app.Application;
import android.app.Instrumentation;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class App extends Application {
    static Object activityThreadInstance;

    @Override
    public void onCreate() {
//        hook();
        super.onCreate();
    }

    public static void hook(boolean hookOrNot) {
        try {
            //这边反射的代码要注意理解，class.forName的返回的并不是一个对象 而是一个类
            Class<?> activityThread = Class.forName("android.app.ActivityThread");
            //而currentActivityThread这个方法是一个静态方法，因为call 一个类的静态方法并不需要用对象来call
            //直接用类就可以call ，所以这里我们用class.forName得到的类就可以直接call这个静态方法
            //从而不需要像平常的反射代码一样要找到一个对象才能反射call这个对象的方法
            Method currentActivityThread = activityThread.getDeclaredMethod("currentActivityThread");
            activityThreadInstance = currentActivityThread.invoke(null);

            //拿到sCurrentActivityThread实例以后就简单多了 就直接替换这里面的mInstrumentation 变量即可
            Field field_instrumentation = activityThreadInstance.getClass()
                    .getDeclaredField("mInstrumentation");
            field_instrumentation.setAccessible(true);
            field_instrumentation.set(activityThreadInstance, hookOrNot ? new FakeInstrumentation():new Instrumentation());

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
    }
}

